﻿<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
				xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
				xmlns:peg="http://schemas.zxteam.net/2014/zxlang/peg/v1"
				xmlns:msxsl="urn:schemas-microsoft-com:xslt"
				exclude-result-prefixes="msxsl peg">
	<xsl:output method="text" indent="no" omit-xml-declaration="yes" encoding="utf-8"/>
	<!--<xsl:preserve-space elements="*"/>-->

	<xsl:template match="/">
		<xsl:variable name="annotationNamespace" select="/peg:grammar/@annotationNamespace"/>

		<xsl:text>using System;
using System.Collections.Generic;
using Nemerle.Assertions;
using Nemerle.Utility;
using Nemerle.Peg;

namespace net.zxteam.zxlang.Lexer.ParserGenerator
{
//    digit                : net.zxteam.zxlang.Lexer.ASTNode = ['0'..'9'] / '^' / '_' / '=' / ' ' / '-' / '+' / '/' / '(' / ')' / '[' / ']';

[PegGrammar(Options = EmitDebugSources, ast,
  grammar
  {
</xsl:text>
		<xsl:apply-templates />
		<xsl:text>

//    bigChar              : net.zxteam.zxlang.Lexer.ASTNode = ['A'..'Z'];
//    bigCharBlock         : net.zxteam.zxlang.Lexer.ASTNode = bigChar+;
//    smallChar            : net.zxteam.zxlang.Lexer.ASTNode = ['a'..'z'];
//    smallCharBlock       : net.zxteam.zxlang.Lexer.ASTNode = smallChar+;
//    digit                : net.zxteam.zxlang.Lexer.ASTNode = ['0'..'9'];
//    digitBlock           : net.zxteam.zxlang.Lexer.ASTNode = digit+;
//    word                 : net.zxteam.zxlang.Lexer.ASTNode = bigChar;
//    ast                  : net.zxteam.zxlang.Lexer.ASTNode = (bigCharBlock / smallCharBlock / digitBlock)+;
  })]
  public partial class Parser { }
}
</xsl:text>
	</xsl:template>

	<xsl:template match="peg:startToken">
		<xsl:text>	ast : net.zxteam.zxlang.Lexer.ASTNode = </xsl:text>
		<xsl:apply-templates />
		<xsl:text>;
</xsl:text>
	</xsl:template>

	<xsl:template match="peg:token[@name]">
		<xsl:text>	</xsl:text>
		<xsl:value-of select="@name"/>
		<xsl:text>Token : net.zxteam.zxlang.Lexer.ASTNode = </xsl:text>
		<xsl:apply-templates />
		<xsl:text>;
</xsl:text>
	</xsl:template>

	<xsl:template match="peg:tokenRef">
		<xsl:value-of select="@ref"/>
		<xsl:text>Token</xsl:text>
	</xsl:template>

	<xsl:template match="peg:sequence">
		<xsl:for-each select="./*">
			<xsl:if test="not(position() = 1)">
				<xsl:text> </xsl:text>
			</xsl:if>
			<xsl:apply-templates select="."/>
		</xsl:for-each>
	</xsl:template>

	<xsl:template match="peg:choice">
		<xsl:for-each select="./*">
			<xsl:if test="not(position() = 1)">
				<xsl:text> / </xsl:text>
			</xsl:if>
			<xsl:apply-templates select="."/>
		</xsl:for-each>
	</xsl:template>

	<xsl:template match="peg:text">
		<xsl:choose>
			<xsl:when test="string-length(@value) &gt; 1">
				<xsl:text>"</xsl:text>
			</xsl:when>
			<xsl:otherwise>
				<xsl:text>'</xsl:text>
			</xsl:otherwise>
		</xsl:choose>
		<xsl:value-of select="@value"/>
		<xsl:choose>
			<xsl:when test="string-length(@value) &gt; 1">
				<xsl:text>"</xsl:text>
			</xsl:when>
			<xsl:otherwise>
				<xsl:text>'</xsl:text>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template match="peg:range">
		<xsl:text>['</xsl:text>
		<xsl:value-of select="@from"/>
		<xsl:text>'..'</xsl:text>
		<xsl:value-of select="@to"/>
		<xsl:text>']</xsl:text>
	</xsl:template>

	<xsl:template match="peg:cardinal">
		<xsl:apply-templates/>
		<xsl:value-of select="@occurs"/>
	</xsl:template>

	<xsl:template match="text()"/>

	<xsl:template name="print-step">
		<xsl:text>/</xsl:text>
		<xsl:value-of select="name()"/>
		<xsl:text>[</xsl:text>
		<xsl:value-of select="1+count(preceding-sibling::*)"/>
		<xsl:text>]</xsl:text>
	</xsl:template>

	<xsl:template name="genPath">
		<xsl:param name="prevPath"/>
		<xsl:variable name="currPath" select="concat('/',name(),'[',
      count(preceding-sibling::*[name() = name(current())])+1,']',$prevPath)"/>
		<xsl:for-each select="parent::*">
			<xsl:call-template name="genPath">
				<xsl:with-param name="prevPath" select="$currPath"/>
			</xsl:call-template>
		</xsl:for-each>
		<xsl:if test="not(parent::*)">
			<xsl:value-of select="$currPath"/>
		</xsl:if>
	</xsl:template>
	
</xsl:stylesheet>
